主目的:
測試主題:紀錄自己的睡眠時長、心情紀錄 & 依區間數據統計
flowchart TD
A[點子發想] --> B[需求梳理]
B --> C[定義功能清單(追蹤睡眠、畫面互動、資料庫串接等)]
C --> D[撰寫 PRD(與 ChatGPT 討論細節)]
D --> E[測試不同工具]
E --> F[Base44 ]
E --> G[Lovable + Supabase]
F --> H[實作階段]
H --> I[實作 AI → ✅ 成功]
H --> J[實作 UI 視覺 → ✅ 成功]
G --> K[實作階段]
K --> L[實作 AI → ❌ 資料庫互動邏輯不 OK]
K --> M[實作 UI 視覺 → ✅ OK]
Step1:根據需求設定PRD
*初始對話 Prompt:
0.品牌/視覺基調
整體走向:柔焦水彩漸層(Soft-Blur Watercolor)+圓角卡片
色彩:淡藍、薰衣草紫、蜜桃橘、晨光黃的低飽和漸層;夜間轉深藍/墨紫。
質感:背景大面積模糊暈染(類似水彩或鏡頭散景 bokeh),前景卡片使用高圓角(16–24px)與輕玻璃擬態(微透明+背景模糊)。
排版:大字標題(字重 600–700),內文 15–16px,字距微寬;重要資訊(時間、打卡)採高對比白字或墨色。
動態:滑順淡入淡出(200–400ms),背景有低頻率流動模糊(避免干擾)。
圖像:太陽/雲層/星點為抽象塊面或輕筆觸,非寫實插畫;避免過度裝飾。
卡片:投影柔和(0 10px 30px rgba(0,0,0,0.08)),不使用硬邊框,可用 1px 內嵌光暈(內線性陰影)。
背景時間主題(延用前一版區段,改為水彩漸層語彙)
06:00–08:00 朦朧天光:#BEE3F8 → #FDE1CF(淡藍→粉橘),加 8–12% 噪點與 16px 高斯模糊流動。
08:00–12:00 豔陽白天:#8FD3FE → #C3B6FF(亮藍→淡紫),右上角有一顆半透明「日暈」。
12:00–17:00 午後:#FFE29A → #A1C4FD(暖黃→天藍),光感降低、對比放柔。
17:00–19:00 傍晚:#FF9A9E → #8EC5FC → #B993D6(橘紅→藍→紫)三段式漸層,水平流動。
19:00–06:00 夜幕:#0B1B3A → #241E4E(深藍→墨紫),散佈 1–2px 微光點(隨機 20–40 顆,閃爍 3–5s 週期)。
前端實作:以 CSS 變數驅動主題(--bg-start / --bg-end / --glow),每分鐘檢查時段,切換 data-theme class,過渡 1s。
1. 分頁
Home(打卡):中央大時鐘(指針+數字)、兩顆打卡按鈕、今日心情分數 (有1~10分10個泡泡,如果果當日點選了就可重畫面消失)
Logs(歷史):按日清單,可編輯/補登。
Insights(趨勢):7/30/90 天折線圖、散點圖:睡眠 vs 心情散點、指標:平均睡眠時數、入睡中位數、起床中位數、連續打卡天數 (streak)
2. 關鍵互動
我要睡了 → 建立未結束 session(sleep_start)。
我起床了 → 補 sleep_end 並計算 duration_minutes。
心情輸入 → 每日單筆 mood_score(重填覆蓋)。
背景切換 → 依小時自動變換主題(見上節)
3. 前端技術
Next.js 14(App Router)、Tailwind + shadcn/ui、Framer Motion(淡入/背景流動)、Recharts(圖表)。
PWA:可安裝、離線暫存打卡(IndexedDB),線上再同步。
狀態:Server Actions + React Query(或只用 SSG/ISR + client fetch)。
4. 後端
Auth:Email OTP / Magic Link;匿名先用 Local Storage 暫存,登入後「合併資料」。
DB:Postgres;一律存 UTC;依使用者時區呈現。
安全:RLS 全開、每表以 user_id = auth.uid() 限定。
5. API(可做成 Server Actions)
POST /sleep/start:建立未結束 session(若存在則 409)。
POST /sleep/end:補上 sleep_end、計算 duration_minutes。
GET /sleep?from&to:查詢期間 sessions。
PUT /sleep/:id:更正/補登(檢查重疊)。
PUT /mood/:day:寫入/更新每日心情。
GET /insights?range=30d:回平均、P50、Streak、相關係數等。
6. 前端樣式(快速落地提示)
主題 class:data-theme="dawn|morning|afternoon|evening|night" 切換 CSS 變數。
變數:
7. API 規格
POST /sleep/start → 建立就寢 session。
POST /sleep/end → 結束 session 並計算時數。
PUT /sleep/:id → 編輯或補登。
PUT /mood/:day → 更新當日心情。
GET /insights?range=30d → 回傳統計與趨勢資料。
Supabase Schema,如果有更好建議或其他作法也可以
-- 擴充 create extension if not exists "uuid-ossp"; create extension if not exists "pgcrypto";
-- 使用者(單人用也保留,方便 RLS 與未來擴充) create table if not exists public.users ( id uuid primary key default auth.uid(), email text unique, created_at timestamptz not null default now() );
-- 睡眠區段:一次就寢→起床 create table if not exists public.sleep_sessions ( id uuid primary key default uuid_generate_v4(), user_id uuid not null references public.users(id) on delete cascade, sleep_start timestamptz not null, -- UTC sleep_end timestamptz, -- UTC duration_minutes int, -- 結束時計算 source text not null default 'manual', -- manual | edited | import notes text, created_at timestamptz not null default now(), updated_at timestamptz not null default now() );
create index on public.sleep_sessions (user_id, sleep_start); create index on public.sleep_sessions (user_id, sleep_end);
-- 每日心情:一天一筆(固定 1..5) create table if not exists public.day_moods ( id uuid primary key default uuid_generate_v4(), user_id uuid not null references public.users(id) on delete cascade, day date not null, -- 以 Asia/Taipei 切日再存(UTC date) mood_score int not null check (mood_score between 1 and 5), notes text, created_at timestamptz not null default now(), unique (user_id, day) );
-- updated_at 觸發器 create or replace function set_updated_at() returns trigger language plpgsql as $$ begin new.updated_at = now(); return new; end $$;
drop trigger if exists trg_sleep_sessions_updated_at on public.sleep_sessions; create trigger trg_sleep_sessions_updated_at before update on public.sleep_sessions for each row execute function set_updated_at();
-- RLS alter table public.users enable row level security; alter table public.sleep_sessions enable row level security; alter table public.day_moods enable row level security;
-- 僅允許本人讀寫 create policy "users_self" on public.users for select using (id = auth.uid()) with check (id = auth.uid());
create policy "sleep_sessions_self" on public.sleep_sessions for all using (user_id = auth.uid()) with check (user_id = auth.uid());
create policy "day_moods_self" on public.day_moods for all using (user_id = auth.uid()) with check (user_id = auth.uid());
Step2:暴力測試法,相同 Prompt 丟進去,就看誰的成果符合預期
小結:
工具 | 完成時間 | 功能達成度 | 易用性 & 挑戰 |
---|---|---|---|
Base44 | 約 30 分鐘 | 幾乎完成所有基本功能,部署上線成功 | 上手快,邏輯設定與資料互動順;但付費牆對 GitHub 推送限制,有些功能受限。 |
Lovable | 約 1 小時 | 還未完全完成所有功能 | 視覺介面直觀;但程式邏輯/資料互動卡頓,需要許多微調與除錯。 |
畫面呈現
首頁
紀錄
趨勢
我做了什麼?
AI 幫我什麼?
遇到的挑戰: